﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data.SqlClient;
using System.IO;
using ankietyzacja.Dao;
using System.Data;
using System.Transactions;
using System.Web.Security;
using ankietyzacja.Logic;

namespace ankietyzacja
{
    public partial class Users : System.Web.UI.Page
    {
        public Int32 EmailId;

        protected void Page_Load(object sender, EventArgs e)
        {

            String EmailIdString = Request.QueryString["email_id"];

            if (EmailIdString != null)
            {

                EmailId = Int32.Parse(EmailIdString);
                                
                AddUserButton.Visible = false;
                ImportujUzytkownikowFileUpload.Visible = false;
                ImportUsersButton.Visible = false;
                wybierzPlikLabel.Visible = false;

                AddRecipientsButton.Visible = true;
                EmailButton.Visible = true;

                UsersSqlDataSource.SelectParameters["ANKIETYZOWALNY"].DefaultValue = "true";
                UsersSqlDataSource.SelectParameters["KONTOCZYNNE"].DefaultValue = "true";

            }
            else
            {
                EmailId = 0;

                AddUserButton.Visible = true;
                ImportujUzytkownikowFileUpload.Visible = true;
                ImportUsersButton.Visible = true;
                wybierzPlikLabel.Visible = true;


                AddRecipientsButton.Visible = false;
                EmailButton.Visible = false;


                UsersSqlDataSource.SelectParameters["ANKIETYZOWALNY"].DefaultValue = "false";
                UsersSqlDataSource.SelectParameters["KONTOCZYNNE"].DefaultValue = "false";

            }



        }


        protected void AddUserButton_Click(object sender, EventArgs e)
        {
            Server.Transfer("PersonalDataChange.aspx?new=1");
        }

        protected void AddRecipientsButton_Click(object sender, EventArgs e)
        {
            String connectionString = ConfigurationManager.ConnectionStrings["ankietyzacjaConnectionString"].ConnectionString;

            SqlConnection connection = new SqlConnection(connectionString);

            connection.Open();

            EmailDao emailDao = new EmailDao(connection, null);

            Int32 AffectedRows = emailDao.insertAdresaci(EmailId, 
                                    ImieFilterTextBox.Text,
                                    NazwiskoFilterTextBox.Text,
                                    NumerAlbumuFilterTextBox.Text,
                                    TrybStudiowFilterDropDownList.SelectedValue,
                                    RokUkonczeniaStudiowFilterDropDownList.SelectedValue);

            connection.Close();

            if (AffectedRows > 0)
            {
                addMessage("Dodano " + AffectedRows + " adresatów do e-maila");

            }


        }

        protected void UsersGridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            HyperLink link = (HyperLink)e.Row.FindControl("nazwiskoHyperLink");

            if (link != null)
            {
                if (EmailId != 0)
                {
                    link.Enabled = false;
                }
                else
                {
                    link.Enabled = true;
                }
            }

            link = (HyperLink)e.Row.FindControl("imieHyperLink");

            if (link != null)
            {
                if (EmailId != 0)
                {
                    link.Enabled = false;
                }
                else
                {
                    link.Enabled = true;
                }
            }

            link = (HyperLink)e.Row.FindControl("numerAlbumuHyperLink");

            if (link != null)
            {
                if (EmailId != 0)
                {
                    link.Enabled = false;
                }
                else
                {
                    link.Enabled = true;
                }
            }
        }

        protected void EmailButton_Click(object sender, EventArgs e)
        {
            Server.Transfer("Email.aspx?email_id=" + EmailId, true);
        }

        protected void ImportUsersButton_Click(object sender, EventArgs e)
        {

            if (!ImportujUzytkownikowFileUpload.HasFile)
            {
                addMessage("Nie wybrano pliku");
                return;
            }


            Stream stream;
            Int32 fileLen;

            fileLen = ImportujUzytkownikowFileUpload.PostedFile.ContentLength;
            if (fileLen == 0)
            {
                addMessage("Podany plik jest pusty");
                return;
            }

            Boolean error = false;

            stream = ImportujUzytkownikowFileUpload.FileContent;

            using (TransactionScope scope = new TransactionScope())
            {

                String connectionString = ConfigurationManager.ConnectionStrings["ankietyzacjaConnectionString"].ConnectionString;

                SqlConnection connection = new SqlConnection(connectionString);

                connection.Open();


                UzytkownikDao uzytkownikDao = new UzytkownikDao(connection, null);
                TrybStudiowDao trybStudiowDao = new TrybStudiowDao(connection, null);

                List<AnkietyzacjaMembershipUser> users = new List<AnkietyzacjaMembershipUser>();


                Int32 index = 0;

                
                using (StreamReader sr = new StreamReader(stream))
                {

                    string line;
                    Char[] separators = new Char[] { ',', ';', '|' };
                    Char[] delimeters = new Char[] { '"', '\'', ' ' };
                    DataTable uzytkownik;




                    while ((line = sr.ReadLine()) != null)
                    {
                        index++;

                        string[] fieldArray = line.Split(separators);

                        for (int i = 0; i < fieldArray.Count(); i++)
                        {
                            fieldArray[i] = fieldArray[i].Trim(delimeters);
                            if (fieldArray[i] == "")
                            {
                                addMessage("Linia " + index + ": Puste pole nr " + i);
                                error = true;
                            }
                        }

                        if (fieldArray.Count() != 6)
                        {
                            addMessage("Linia " + index + ": Nieprawidłowa liczba pól (powinno być 6, jest " + fieldArray.Count() + ")");
                            error = true;
                            continue;
                        }

                        int numerAlbumu;
                        if (!Int32.TryParse(fieldArray[2], out numerAlbumu))
                        {
                            addMessage("Linia " + index + ": Nieprawidłowy numer albumu: " + fieldArray[2]);
                            error = true;
                        }
                        else
                        {
                            uzytkownik = uzytkownikDao.loadForNumerAlbumu(numerAlbumu);
                            if (uzytkownik.Rows.Count > 0)
                            {
                                addMessage("Linia " + index + ": W systemie istnieje już użytkownik z numerem albumu " + fieldArray[2]);
                                error = true;
                            }
                        }

                        int rokUkonczeniaStudiow;
                        if (!Int32.TryParse(fieldArray[3], out rokUkonczeniaStudiow))
                        {
                            addMessage("Linia " + index + ": Nieprawidłowy rok ukończenia studiów: " + fieldArray[3]);
                            error = true;
                        }

                        DataTable trybStudiow = trybStudiowDao.loadForTryb(fieldArray[4]);
                        if (trybStudiow.Rows.Count == 0)
                        {
                            addMessage("Linia " + index + ": Nieprawidłowy tryb studiów: " + fieldArray[4]);
                            error = true;
                        }



                        //uzytkownik = uzytkownikDao.loadForEmail(fieldArray[5]);
                        //if (uzytkownik.Rows.Count > 0)
                        //{
                        //    addError("Linia " + index + ": W systemie istnieje już użytkownik z adresem e-mail " + fieldArray[5]);
                        //    error = true;
                        //}

                        if (!error)
                        {
                            String userName = uzytkownikDao.getUserName(fieldArray[0], fieldArray[1], fieldArray[3]);

                            AnkietyzacjaMembershipUser user = uzytkownikDao.utworzMembership(userName, fieldArray[5]);

                            users.Add(user);

                            uzytkownikDao.utworzUzytkownika(user.user.ProviderUserKey.ToString(),
                                                            fieldArray[0],
                                                            fieldArray[1],
                                                            Int32.Parse(fieldArray[2]),
                                                            Int32.Parse(fieldArray[3]),
                                                            Int32.Parse(trybStudiow.Rows[0]["TRYBSTUDIOW_ID"].ToString())
                                                            );

                        }
                    }
                }

                if (!error)
                {
                    UsersGridView.DataBind();

                    scope.Complete();

                    AnkietyzacjaSmtpClient ankietyzacjaSmtpClient = new AnkietyzacjaSmtpClient();

                    foreach (AnkietyzacjaMembershipUser u in users)
                    {
                        ankietyzacjaSmtpClient.newUserEmail(u.user.UserName, u.password, u.user.Email);

                    }

                    addMessage("Zaimportowano poprawnie " + index + " absolwentów");

                }

                connection.Close();

            }

        }


        private void addMessage(String er)
        {
            CustomValidator val = new CustomValidator();
            val.IsValid = false;
            val.ErrorMessage = er;
            this.Page.Validators.Add(val);
        }


    }

}